/*
珂珂喜欢吃香蕉。这里有 N 堆香蕉，第 i 堆中有 piles[i] 根香蕉。警卫已经离开了，将在 H 小时后回来。
珂珂可以决定她吃香蕉的速度 K （单位：根/小时）。每个小时，她将会选择一堆香蕉，从中吃掉 K 根。如果这堆香蕉少于 K 根，她将吃掉这堆的所有香蕉，
然后这一小时内不会再吃更多的香蕉。  珂珂喜欢慢慢吃，但仍然想在警卫回来前吃掉所有的香蕉。
返回她可以在 H 小时内吃掉所有香蕉的最小速度 K（K 为整数）。

示例 1：
输入: piles = [3,6,7,11], H = 8
输出: 4
示例 2：

输入: piles = [30,11,23,4,20], H = 5
输出: 30
示例 3：
输入: piles = [30,11,23,4,20], H = 6
输出: 23
提示：
1 <= piles.length <= 10^4
piles.length <= H <= 10^9
1 <= piles[i] <= 10^9
*/


class Solution {
public:
    int minEatingSpeed(vector<int>& piles, int H) {
        int l=1,r=INT_MIN;//最少吃1个 最多吃max(piles)个 因为再多吃 次数也是一样的
        for(auto p:piles)
            r=max(r,p);//数组中最大的值
        while(l<r)
        {
            int mid=(r-l)/2+l;//当前轮每小时吃的速度
            int h=0;//当前轮吃的总时间
            for(auto p:piles)
            {
                if(p%mid==0)
                    h+=p/mid;//整除 吃的时间=除法结果
                else
                    h+=p/mid+1;//有余数 需要多吃一次
            }
            if(h<=H)
                r=mid;//不要直接搜索mid-1 因为结果可能会太小
            else
                l=mid+1;//当前吃的太慢 左起点右移 注意l和r每一轮必须有一个移动
        }
        return l;
    }
};
